package cn.tedu.mall.service;

import cn.tedu.mall.vo.ImageVO;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

@Service
@PropertySource(value = "classpath:/properties/image.properties")
public class FileServiceImpl implements FileService{
    //3.声明一个图片上传的路径
    @Value("${image.path}")
    private String path;
    @Value("${image.urlPath}")
    private String urlPath;
    /**
     * 1.图片的校验 .jpg
     * 2.校验文件是否为恶意程序，例如：木马病毒 木马.exe.jpg
     * 3.指定文件上传的具体路径，分目录存储图片，可以控制目录里图片的数量
     * 4.防止重名处理
     */
    @Override
    public ImageVO uploadFile(MultipartFile uploadFile) {
        //1.获取图片的名称 xxx.jpg/xxx.JPG
        String fileName = uploadFile.getOriginalFilename();
        //1.1将图片的名称的字母转换成小写
        fileName=fileName.toLowerCase();
        //1.2利用正则表达式进行校验该文件是否是图片
        if (!fileName.matches(".+(.jpeg|.jpg|.gif|.png)$")){
            return ImageVO.fail();
        }
        //2.校验文件是否为恶意程序
        try {
            BufferedImage bufferedImage = ImageIO.read(uploadFile.getInputStream());
            int width = bufferedImage.getWidth();
            int height = bufferedImage.getHeight();
            if (width<=0 || height<=0){
                return ImageVO.fail();
            }
            //4.按照年月日，分目录存储图片
            String datePath=new SimpleDateFormat("yyyy/MM/dd/").format(new Date());
            //4.1拼接本地存储路径
            String fileLocalPath=path+datePath;
            //4.2将图片的本地路径封装在一个file对象中进行操作
            File fileDir=new File(fileLocalPath);
            if (!fileDir.exists()){
                //目录结构不存在，则创建多级目录
                fileDir.mkdirs();
            }
        //5.防止文件重名，指定文件名称  uuid.jpg
            String uuid=UUID.randomUUID().toString().replace("-","");
            String fileType=fileName.substring(fileName.lastIndexOf("."));
            //5.1拼接文件名称
            String realFileName=uuid+fileType;
            //6.基于文件完整路径实现文件的上传
            //6.1完成的上传路径 目录+文件名
            String realPathFile=fileLocalPath+realFileName;
            uploadFile.transferTo(new File(realPathFile));
            //http://image.jt.com/yyyy/MM/dd/uuid.jpg
            String url=urlPath+datePath+realFileName;
            System.out.println(url);
            //http://image.jt.com:80/2023/09/27/2d0198a519a846d99f004257882ad3ba.jpg
            //D:/mallImage/2023/09/27/2d0198a519a846d99f004257882ad3ba.jpg
            return ImageVO.success(url,width,height);

        }catch (Exception e){
            e.printStackTrace();
            return ImageVO.fail();
        }
    }
}
